<?php

require_once 'BancoDeDados.php';
require_once 'Objeto.php';

class HistoricoMovimentacao {

    private $cod_historico_movimentacao;
    private $origem;
    private $destino;
    private $finalidade;
    private $data_saida;
    private $data_retorno;
    private $tecnico_responsavel;
    private $objeto;

    public function &getCod_historico_movimentacao() {
        return $this->cod_historico_movimentacao;
    }

    public function setCod_historico_movimentacao(&$cod_historico_movimentacao) {
        $this->cod_historico_movimentacao = &$cod_historico_movimentacao;
    }

    public function &getOrigem() {
        return $this->origem;
    }

    public function setOrigem(&$origem) {
        $this->origem = &$origem;
    }

    public function &getDestino() {
        return $this->destino;
    }

    public function setDestino(&$destino) {
        $this->destino = &$destino;
    }

    public function &getFinalidade() {
        return $this->finalidade;
    }

    public function setFinalidade(&$finalidade) {
        $this->finalidade = &$finalidade;
    }

    public function &getData_saida() {
        return $this->data_saida;
    }

    public function setData_saida(&$data_saida) {
        $this->data_saida = &$data_saida;
    }

    public function &getData_retorno() {
        return $this->data_retorno;
    }

    public function setData_retorno(&$data_retorno) {
        $this->data_retorno = &$data_retorno;
    }

    public function &getTecnico_responsavel() {
        return $this->tecnico_responsavel;
    }

    public function setTecnico_responsavel(&$tecnico_responsavel) {
        $this->tecnico_responsavel = &$tecnico_responsavel;
    }

    /**
     *
     * @return Objeto
     */
    public function &getObjeto() {
        return $this->objeto;
    }

    public function setObjeto(Objeto &$objeto) {
        $this->objeto = &$objeto;
    }

    /**
     * @method void cadastrar() para cadastro do recurso
     * @return void
     */
    public function cadastrar() {
        if (!$this->validar()) {
            throw new Exception('Histórico Movimentação existente');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into historico_movimentacao(cod_interno, data_retorno, data_saida, finalidade, destino, origem, tecnico_responsavel) values(?,?,?,?,?,?)');
        $result = $link->execute($stmt, array($this->objeto->getCod_interno(), $this->data_retorno, $this->data_saida, $this->finalidade, $this->destino, $this->origem, $this->tecnico_responsavel));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $result = $banco->getLink()->query('select cod_historico_movimentacao from historico_movimentacao where data_retorno = ? and data_saida = ? and finalidade = ? and destino = ? and origem = ? and tecnico_responsavel = ? and cod_interno = ?', array($this->data_retorno, $this->data_saida, $this->finalidade, $this->destino, $this->origem, $this->tecnico_responsavel, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("Histórico Movimentação inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Histórico Movimentação com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $this->setCod_historico_movimentacao($row['cod_historico_movimentacao']);
        $link->commit();
    }

    /**
     * @method void alterar() para alteração do recurso
     * @return void
     */
    public function alterar() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update historico_movimentacao set data_retorno = ?, data_saida = ?, finalidade = ?, destino = ?, origem = ?, tecnico_responsavel = ? where cod_historico_movimentacao = ?');
        $result = $link->execute($stmt, array($this->data_retorno, $this->data_saida, $this->finalidade, $this->destino, $this->origem, $this->tecnico_responsavel, $this->cod_historico_movimentacao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'data_retorno' && $this->data_retorno != $campo_valor) {
            $this->data_retorno = &$campo_valor;
            if (!$this->validar()) {
                throw new Exception("Histórico Movimentação existente");
            }
        } else if ($campo_id == 'data_saida' && $this->data_saida != $campo_valor) {
            $this->data_saida = &$campo_valor;
            if (!$this->validar()) {
                throw new Exception("Histórico Movimentação existente");
            }
        } else if ($campo_id == 'finalidade' && $this->finalidade != $campo_valor) {
            $this->finalidade = &$campo_valor;
            if (!$this->validar()) {
                throw new Exception("Histórico Movimentação existente");
            }
        } else if ($campo_id == 'destino' && $this->destino != $campo_valor) {
            $this->destino = &$campo_valor;
            if (!$this->validar()) {
                throw new Exception("Histórico Movimentação existente");
            }
        } else if ($campo_id == 'origem' && $this->origem != $campo_valor) {
            $this->origem = &$campo_valor;
            if (!$this->validar()) {
                throw new Exception("Histórico Movimentação existente");
            }
        } else if ($campo_id == 'tecnico_responsavel' && $this->tecnico_responsavel != $campo_valor) {
            $this->tecnico_responsavel = &$campo_valor;
            if (!$this->validar()) {
                throw new Exception("Histórico Movimentação existente");
            }
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update historico_movimentacao set ' . $campo_id . ' = ? where cod_historico_movimentacao = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_historico_movimentacao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from historico_movimentacao where cod_historico_movimentacao = ?');
        $result = $link->execute($stmt, array($this->cod_historico_movimentacao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function listar(&$cod_interno) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from historico_movimentacao where cod_interno = ?', array($cod_interno));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $historico_movimentacao = new HistoricoMovimentacao();
            $historico_movimentacao->setCod_historico_movimentacao($row['cod_historico_movimentacao']);
            $historico_movimentacao->setData_retorno($row['data_retorno']);
            $historico_movimentacao->setData_saida($row['data_saida']);
            $historico_movimentacao->setFinalidade($row['finalidade']);
            $historico_movimentacao->setDestino($row['destino']);
            $historico_movimentacao->setOrigem($row['origem']);
            $historico_movimentacao->setTecnico_responsavel($row['tecnico_responsavel']);
            $resultado[$row['cod_historico_movimentacao']] = &$historico_movimentacao;
            unset($historico_movimentacao);
        }
        return $resultado;
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_historico_movimentacao from historico_movimentacao where data_retorno = ? and data_saida = ? and finalidade = ? and destino = ? and origem = ? and tecnico_responsavel = ?', array($this->data_retorno, $this->data_saida, $this->finalidade, $this->destino, $this->origem, $this->tecnico_responsavel));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return false;
        }
        return true;
    }

}
?>